#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define OK 1
#define FAILURE 0
#define SUCCESS 2
#define OUTOFINDEX -1
#define TRUE 1
#define FALSE 0
#define NOLIST -2
#define LIST_INIT_SIZE 10
#define LISTINCREAMENT 5

typedef int Status;
typedef unsigned int ElemSet;

//************线性链表***********************************

typedef struct{
	ElemSet *elem;
	int length;
	int listsize;
}SqList;

//初始化线性表，接收一个线性表类型和一个ElemSet类型数组，用数组元素初始化线性表
Status InitList(SqList* L){
	L->elem=(ElemSet *)malloc(LIST_INIT_SIZE * sizeof(ElemSet));
	int i;
	if(!L->elem) return FAILURE;
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
	for(i=0;i<L->listsize;i++){
		L->elem[i]=0;
	}
	return SUCCESS;
}

Status DestoryList(SqList* L){
	if(L->elem==NULL)return FAILURE;
	free(L->elem);
	return SUCCESS;
}

Status IncreasListSpace(SqList* L,int len){
	while(L->listsize < len){
		ElemSet* text;
		text=(ElemSet*)realloc(L->elem,(L->listsize+LISTINCREAMENT)*sizeof(ElemSet));
		if(text==NULL)return FAILURE;
		L->elem=text;
		L->listsize+=LISTINCREAMENT;

	}
	return SUCCESS;
}

Status FillList(SqList* L,ElemSet* S,int len){
	if(L->elem==NULL)return FAILURE;
	if(L->listsize < len) if(IncreasListSpace(L,len)==FAILURE) return FAILURE;
	int i;
	for(i=0;i<len;i++){
		L->elem[i]=S[i];
	}
	return SUCCESS;
}


Status CleLrList(SqList* L){
	if(L->elem==NULL)return FAILURE;
	int i;
	for(i=0;i< L->listsize ;i++){
		L->elem[i]=0;
	}
	return OK;
}

Status IsListEmpty(SqList* L){
	if(L->elem==NULL)return TRUE;
	int i;
	for(i=0;i<L->listsize;i++){
		if(L->elem[i]!=0) return FALSE;
	}
	return TRUE;
}

int ListLength(SqList* L){
	if(L->elem==NULL) return NOLIST;
	int i;
	for(i=0;i<=L->listsize;i++){
		if(L->elem[i]==0) return i;
	}
	return L->listsize;
}

Status GetElem(SqList* L,int i,ElemSet* e){
	if(L->elem==NULL && i>0 && i < L->listsize) return FAILURE;
	*e=L->elem[i];
	return SUCCESS;
}

int equal(SqList* L,ElemSet e){
	int i,len=ListLength(L);
	for(i=0;i<len;i++){
		if(L->elem[i]==e) return i+1;
 	}
 	return OUTOFINDEX;
}

int LocLteElem(SqList* L,ElemSet e,int (*FUNC)(SqList* L,ElemSet e)){
	int i=(*FUNC)(L,e);
	if(i==OUTOFINDEX) return 0;
	return i;
}

Status PriorElem(SqList* L,ElemSet cur,ElemSet* pre){
	int i;
	for(i=1;i<L->listsize;i++){
		if(L->elem[i]==cur) return L->elem[i-1];
	}
	return FAILURE;
}

Status NextElem(SqList* L,ElemSet cur,ElemSet* next){
	int i;
	for(i=L->listsize-2;i>=0;i--){
		if(L->elem[i]==cur) return L->elem[i+1];
	}
	return OUTOFINDEX;
}

Status ListInsert(SqList* L,int t,ElemSet e){
	int i,len=ListLength(L);
	if(t>len+1 && t<1) return OUTOFINDEX;
	for(i=len-1;i>=t;i--){
		L->elem[i+1]=L->elem[i];
	}
	L->elem[i+1]=e;
	L->length+=1;
	return SUCCESS;
}

Status ListDelete(SqList* L,int t,ElemSet* e){
int i,len=ListLength(L);
	if(t>len+1 && t<1) return OUTOFINDEX;
	*e=L->elem[t-1];
	for(i=t-1;i<len;i++){
		L->elem[i]=L->elem[i+1];
	}
	L->length-=1;
	return SUCCESS;
}

Status ListTrLverse(SqList* L,int (*FUNC)(ElemSet )){
	if(L->elem==NULL) return FAILURE;
	int i,len=ListLength(L);
	for(i=0;i<len;i++){
		if((*FUNC)(L->elem[i])==FAILURE) return FAILURE;
	}
	return SUCCESS;
}

//**************待测评******************************//

Status ListCompare(SqList* L,ElemSet e){
	if(L->elem==NULL) return FAILURE;
	int len=ListLength(L);
	int i;
	for(i=0;i<len;i++){
		if(L->elem[i]<e && L->elem[i+1]>e) return i+1;
	}
}

Status ToString(SqList* L,char* str){
	int len=ListLength(L);
	sprintf(str,"%d",L->elem);
	return SUCCESS;
}

Status Union(SqList* A,SqList* B){
	if(A->elem==NULL || B->elem==NULL) return FAILURE;
	int i,index;
	int la=ListLength(A);
	int lb=ListLength(B);
	ElemSet test;
	for(i=0;i<la;i++){
		if(index=(LocLteElem(A,B->elem[i],equal))==0) return FAILURE;
		ListInsert(A,index,B->elem[i]);
	}
}